home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / t_sys5 / 92052tar.gz / 920528.tar / tnserv.c < prev    next >
C/C++ Source or Header  |  1992-05-28  |  2KB  |  100 lines

  1. /* @(#) $Header: tnserv.c,v 1.8 92/05/28 13:50:38 deyke Exp $ */
  2.  
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "socket.h"
  6. #include "netuser.h"
  7. #include "tcp.h"
  8. #include "login.h"
  9. #include "tipmail.h"
  10.  
  11. static struct tcb *tcb_server;
  12.  
  13. /*---------------------------------------------------------------------------*/
  14.  
  15. static void tnserv_recv_upcall(tcb, cnt)
  16. struct tcb *tcb;
  17. int  cnt;
  18. {
  19.   struct mbuf *bp;
  20.  
  21.   if (tcb->user) {
  22.     recv_tcp(tcb, &bp, 0);
  23.     login_write((struct login_cb *) tcb->user, bp);
  24.   }
  25. }
  26.  
  27. /*---------------------------------------------------------------------------*/
  28.  
  29. static void tnserv_send_upcall(tcb, cnt)
  30. struct tcb *tcb;
  31. int  cnt;
  32. {
  33.   struct mbuf *bp;
  34.  
  35.   if (tcb->user &&
  36.       (bp = login_read((struct login_cb *) tcb->user, space_tcp(tcb))))
  37.     send_tcp(tcb, bp);
  38. }
  39.  
  40. /*---------------------------------------------------------------------------*/
  41.  
  42. static void tnserv_state_upcall(tcb, old, new)
  43. struct tcb *tcb;
  44. int  old, new;
  45. {
  46.   switch (new) {
  47. #ifdef  QUICKSTART
  48.   case TCP_SYN_RECEIVED:
  49. #else
  50.   case TCP_ESTABLISHED:
  51. #endif
  52.     tcb->user = (int) login_open(pinet_tcp(&tcb->conn.remote), "TELNET", (void (*)()) tnserv_send_upcall, (void (*)()) close_tcp, tcb);
  53.     if (!tcb->user)
  54.       close_tcp(tcb);
  55.     else
  56.       log(tcb, "open TELNET");
  57.     break;
  58.   case TCP_CLOSE_WAIT:
  59.     close_tcp(tcb);
  60.     break;
  61.   case TCP_CLOSED:
  62.     if (tcb->user) {
  63.       login_close((struct login_cb *) tcb->user);
  64.       log(tcb, "close TELNET");
  65.     }
  66.     del_tcp(tcb);
  67.     if (tcb == tcb_server) tcb_server = NULLTCB;
  68.     break;
  69.   }
  70. }
  71.  
  72. /*---------------------------------------------------------------------------*/
  73.  
  74. int  telnet0(argc, argv, p)
  75. int  argc;
  76. char  *argv[];
  77. void *p;
  78. {
  79.   if (tcb_server) close_tcp(tcb_server);
  80.   return 0;
  81. }
  82.  
  83. /*---------------------------------------------------------------------------*/
  84.  
  85. int  telnet1(argc, argv, p)
  86. int  argc;
  87. char  *argv[];
  88. void *p;
  89. {
  90.   struct socket lsocket;
  91.  
  92.   if (tcb_server) close_tcp(tcb_server);
  93.   lsocket.address = INADDR_ANY;
  94.   lsocket.port = (argc < 2) ? IPPORT_TELNET : tcp_port_number(argv[1]);
  95.   tcb_server = open_tcp(&lsocket, NULLSOCK, TCP_SERVER, 0, tnserv_recv_upcall,
  96.             tnserv_send_upcall, tnserv_state_upcall, 0, 0);
  97.   return 0;
  98. }
  99.  
  100.